package org.wmsafe.service;

import org.springframework.cglib.proxy.Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 使用spring5的aop动态代理 将HeadLinkService接口具体实现新增一个log日志输出方法
 * by：2021-10-14 迷途清风
 * **/
//这里要实现aop动态代理就必须实现InvocationHandler接口重写里面的invoke方法
public class ProxyHeadLinkService implements InvocationHandler {
    private HeadLinkService headLinkService; //定义需要代理的接口（真实代理的角色）

    //这里用set方法进行注入所需要代理的对象
    public void setHeadLinkService(HeadLinkService headLinkService) {
        this.headLinkService = headLinkService;
    }

    //这里通过getProxy方法获取代理对象
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                headLinkService.getClass().getInterfaces(), this::invoke);
    }

    //invoke里面返回需要代理的对象，这里可以在里面新增一些需要新加的功能
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log();
        Object result = method.invoke(headLinkService,args);
        return result;
    }

    public void log(){
        System.out.println("成功实现动态代理，进行aop横向切面编程新增功能");
    }
}
